/*
	Title: events

 	Este archivo contiene la clase EH que será quien controle los manejadores de todos los eventos de la Web 
	El código original ha sido extraido de librosweb.es (Introducción a AJAX).

	Las modificaciones consisten en añadir un temporizador (timer) que impide el usuario pueda interactuar
	con los elementos hasta que no haya pasado ese tiempo estipulado desde la última interacción

	Compatible con todos los navegadores
*/

var EH = new Object();

EH.elements = new Array();
EH.elements_func = false;

/* Añade un evento a una función
 *
 * elemento:	Es el elemento sobre el que se añade la función
 * tipoEvento:	Es la acción que tiene que ocurrir para que se lance ("onclic" -> tipoEvento = "click"...)
 * func:		Funcion que se lanza cuando ocurre el evento.
 * timer:		Tiempo que hay que esperar despues de un evento.
 */
EH.addEventHandler = function(elemento, tipoEvento, func, timer)
{
	if(elemento.addEventListener) // Navegadores DOM
	{
		elemento.addEventListener(tipoEvento, func, false);
	}
	else if(elemento.attachEvent) // Internet Explorer
	{
		elemento.attachEvent("on" + tipoEvento, func);
	}
	else // Resto de navegadores
	{
		elemento["on" + tipoEvento] = func;
	}

	elemento.active = true;
	elemento.timer = timer? timer : 1;

}

// Elimina la asociación de un evento a una función en un elemento.
EH.removeEventHandler = function(elemento, tipoEvento, func)
{
	if(elemento.addEventListener) // Navegadores DOM
	{
		elemento.removeEventListener(tipoEvento, func, false);
	}
	else if(elemento.attachEvent) // Internet Explorer
	{
		elemento.detachEvent("on" + tipoEvento, func);
	}
	else // Resto de navegadores
	{
		elemento["on" + tipoEvento] = null;
	}
}

/* Comprueba si el elemento está activo, es decir, que ha pasado el suficiente tiempo
 * desde que se lanzara el evento anterior (timer)
 */
EH.getActive = function(element)
{
	var res = false;

	if(element.active)
	{
		res = true;

		element.active = false;
		setTimeout(function() { element.active = true; }, element.timer);

	}
	else
		res = false;

	return res;
}


/* Devuelve los datos de un evento ('event') de un evento.
 * Tiene compatibilidad con IE, ya que convierte el window.event a un formato estándar.
 */
EH.getEvent = function()
{
	var event = false;

	if(window.event) // Internet Explorer
		event = this.formatEvent(window.event);
	else	// Navegadores DOM
		event = EH.getEvent.caller.arguments[0];

	return event;
}


// Conversión del elemento event (para hacer IE 'estándar')
EH.formatEvent = function(event)
{
	var isIE = navigator.userAgent.toLowerCase().indexOf('msie')!=-1;

	if(isIE)
	{
		event.charCode = (event.type == "keypress") ? event.keyCode : 0;
		event.eventPhase = 2;
		event.isChar = (event.charCode > 0);
		event.pageX = event.clientX + document.body.scrollLeft;
		event.pageY = event.clientY + document.body.scrollTop;

		event.preventDefault = function()
		{
			this.retunValue = false;
		}

		if(event.type == "mouseout")
		{
			event.relatedTarget = event.toElement;
		}
		else if(event.type == "mouseover")
		{
			event.relatedTarget = event.fromElement;
		}

		event.stopPropagation = function()
		{
			this.cancelBuble = true;
		}

		event.target = event.srcElement;

		event.time = (new Date).getTime();
	}

	return event;
}

